home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / PROFILER / TALER.PRO < prev    next >
Encoding:
Text File  |  1989-06-16  |  6.3 KB  |  173 lines

  1. PROGRAM Erbteilung; { 7. Bundeswettbewerb Informatik 1988/1989 }
  2.                     { 1. Runde, Aufgabe 3 ; Autor M. Berger    }
  3.                     {     Bitte Hinweise am Ende beachten !    }
  4. CONST Max_Anzahl_Goldstuecke  = 100;
  5.       Max_Anzahl_Erben        = 10;
  6.       
  7. TYPE  Geldkiste          = ARRAY [1..Max_Anzahl_Goldstuecke] OF
  8.                                  INTEGER;
  9. VAR   Goldstuecke        : Geldkiste;   {  GOLDSTUECKE : 110  }
  10.       Anzahl_Goldstuecke : INTEGER;
  11.                         {  ANZAHL_GOLDSTUECKE : 49  Min 0.  Max 14  }
  12.       Anzahl_Erben       : INTEGER;  {  ANZAHL_ERBEN : 6  Min 2  Max 2  }
  13.       
  14.   PROCEDURE Eingabe;  { 1 }
  15.     BEGIN
  16.       CLRSCR;WRITELN('Erbteilung  (bwINF 7 [88/89];Aufgabe 2)');WRITELN;
  17.       WRITELN;WRITE('  Bitte Anzahl Erben(Erbinnen) eingeben : ');
  18.       REPEAT  { 1 }
  19.         READLN(Anzahl_Erben);
  20.       UNTIL Anzahl_Erben<Max_Anzahl_Erben;
  21.       WRITELN;WRITELN('  Bitte Werte der Münzen eingeben (Ende mit <RETURN>)');
  22.       Anzahl_Goldstuecke:=0;
  23.       REPEAT  { 14 }
  24.         Anzahl_Goldstuecke:=Anzahl_Goldstuecke+1;
  25.         WRITE('     ->');
  26.         READLN(Goldstuecke[Anzahl_Goldstuecke]);
  27.       UNTIL (Goldstuecke[Anzahl_Goldstuecke]=0) OR 
  28.             (Anzahl_Goldstuecke>Max_Anzahl_Goldstuecke);
  29.       Anzahl_Goldstuecke:=Anzahl_Goldstuecke-1;
  30.       WRITELN;WRITELN;CLRSCR;
  31.     END;
  32.     
  33.   PROCEDURE Aufteilung;  { 1 }
  34.           
  35.     VAR i,u                : INTEGER;  {  I : 42  Min 0.  Max 14  }
  36.                         {  U : 30  Min 0.  Max 102  }
  37.         jeder_erbt         : INTEGER;  {  JEDER_ERBT : 29  Min 51  Max 51  }
  38.         Akt_Erbe           : INTEGER;  {  AKT_ERBE : 6  Min 0.  Max 2  }
  39.         Ergebniss_gefunden : BOOLEAN;  {  ERGEBNISS_GEFUNDEN : 79  }
  40.         HILFSarray         : Geldkiste;  {  HILFSARRAY : 2  }
  41.     
  42.     FUNCTION ermittle_durchschnittl_Erbe : REAL;  { 3 }
  43.       VAR i         : INTEGER;  {  I : 42  Min 1  Max 14  }
  44.           hilfsumme : REAL;  {  HILFSUMME : 48  Min 0.  Max 102  }
  45.       BEGIN
  46.         hilfsumme:=0;
  47.         FOR i:=1 TO Anzahl_Goldstuecke DO  { 39 }
  48.         BEGIN
  49.           hilfsumme:=hilfsumme+Goldstuecke[i];
  50.         END;
  51.         hilfsumme:=hilfsumme/Anzahl_Erben;
  52.         ermittle_durchschnittl_Erbe:=hilfsumme;
  53.       END;
  54.       
  55.     PROCEDURE teste (Uebrige    : Geldkiste;  { 73 }  { Max. Rekursion: 6 }
  56.                         {  UEBRIGE : 254  }
  57.                      Genommene  : Geldkiste;  {  GENOMMENE : 97  }
  58.                      Anz_Genomm : INTEGER;
  59.                         {  ANZ_GENOMM : 99  Min 1  Max 7  }
  60.                      Summe      : INTEGER;  {  SUMME : 112  Min 10  Max 51  }
  61.                      Stelle     : INTEGER);  {  STELLE : 97  Min 1  Max 13  }
  62.      
  63.       VAR  i    : INTEGER;  {  I : 153  Min 2  Max 14  }
  64.            Zahl : INTEGER;  {  ZAHL : 99  Min 3  Max 17  }
  65.       
  66.       PROCEDURE Ausgabe;  { 2 }
  67.         VAR i,u : INTEGER;  {  I : 43  Min 1  Max 14  }
  68.                         {  U : 0.  Min ---  Max ---  }
  69.         BEGIN
  70.           WRITELN('Es erbt Erbe Nr. ',akt_Erbe,' die Münzen :  ');
  71.           WRITE('  ');
  72.           FOR i:=1 TO Anz_Genomm DO  { 13 }
  73.           BEGIN
  74.             IF i>1 THEN WRITE(',');  { 11 }
  75.             WRITE(Genommene[i]);
  76.           END;
  77.           WRITELN('.  Summe = ',Summe);WRITELN;
  78.           FOR i:=1 TO Anzahl_Goldstuecke DO  { 26 }
  79.             Goldstuecke[i]:=Uebrige[i];
  80.         END;
  81.       
  82.       BEGIN
  83.         Zahl:=Uebrige[Stelle];
  84.         IF NOT(Ergebniss_Gefunden) THEN  { 13 }
  85.         BEGIN
  86.           Summe:=Summe+Zahl;
  87.           IF Summe<=jeder_erbt THEN  { 13 }
  88.           BEGIN
  89.             Uebrige[Stelle]:=0;
  90.             Anz_Genomm:=Anz_Genomm+1;
  91.             Genommene[Anz_Genomm]:=Zahl;
  92.             IF Summe<jeder_erbt THEN  { 11 }
  93.             BEGIN
  94.               FOR i:=Stelle+1 TO Anzahl_Goldstuecke DO  { 71 }
  95.                 IF Uebrige[i]>0 THEN  { 71 }
  96.                   teste(Uebrige,Genommene,Anz_Genomm,Summe,i);
  97.             END
  98.             ELSE  { 2 }
  99.             BEGIN
  100.               Ergebniss_gefunden:=TRUE;
  101.               Ausgabe;
  102.             END;
  103.           END;
  104.         END;
  105.       END;
  106.     
  107.     BEGIN
  108.       IF ermittle_durchschnittl_Erbe=INT(ermittle_durchschnittl_Erbe) THEN
  109.                                   { 1 }
  110.       BEGIN
  111.         jeder_erbt:=ROUND(ermittle_durchschnittl_Erbe);
  112.         Akt_Erbe:=0;
  113.         REPEAT  { 2 }
  114.           Akt_Erbe:=Akt_Erbe+1;
  115.           Ergebniss_gefunden:=FALSE;
  116.           u:=0;
  117.           FOR i:=1 TO Anzahl_Goldstuecke DO  { 26 }
  118.             u:=u+Goldstuecke[i];
  119.           IF u>=jeder_erbt THEN  { 2 }
  120.           BEGIN
  121.             i:=0; 
  122.             REPEAT  { 8 }
  123.               i:=i+1;
  124.             UNTIL Goldstuecke[i]>0;
  125.             teste(Goldstuecke,HILFSarray,0,0,i);
  126.           END;
  127.         UNTIL (Ergebniss_gefunden=FALSE) OR (Akt_Erbe=Anzahl_Erben);
  128.         IF Ergebniss_gefunden=FALSE THEN  { 0. }
  129.         BEGIN
  130.           WRITELN;WRITE(' Erbe Nr. ',Akt_Erbe,' würde nicht das richtige ');
  131.           WRITE('Erbe erhalten. Es erbt das Kloster. ');
  132.         END;
  133.       END
  134.       ELSE  { 0. }
  135.       BEGIN
  136.         WRITELN;WRITELN(' Eine Aufteilung geht nicht. Das Kloster erbt. ');
  137.       END;
  138.     END;
  139.   
  140.   BEGIN
  141.     Eingabe;
  142.     Aufteilung;
  143.   END.
  144. {
  145.  Problemstellung :
  146.  
  147.  Die Baronin von Birlinghoven hat ihren beiden Töchtern eine Truhe voller
  148.  Goldmünzen hinterlassen. Ihr Testament bestimmt, daß das Gold einem benach-
  149.  barten Kloster zukommt, falls es den Töchtern nicht gelingt, den Ihnalt der
  150.  Truhe wertmäßig genau in zwei Hälften aufzuteilen. Die Goldmünzen haben nur
  151.  ganzzahlige Werte.
  152.  Eine Truhe Goldmünzen mit den Werten 1,9,5,3,8 Taler könnten die
  153.  Töchter in die Hälften 1,9,3 Taler und 5,8 Taler teilen.
  154.  Eine Truhe Goldmünzen mit den Werten 1,9,7,3,8 Taler fiele an das Kloster,
  155.  weil die Aufteilung nicht möglich ist.
  156.  Schreibe ein Programm, das bei Eingabe einer Folge ganzer Zahlen für die in
  157.  der Truhe vorkommenden Werte die Erbteile genau aufzählt, andernfalls das 
  158.  Erbe dem Kloster zuspricht, falls eine Aufteilung nicht möglich ist.
  159.  
  160.  Beispiel :
  161.   
  162.   Münzwerte : 17,3,7,6,8,10,10,5,5,4,10,9,8
  163.   Erbinnen  : 2
  164.   Ergebnis  : Erbin 1 erbt 51 Taler, nämlich 17,3,7,6,8,10
  165.                     2      51                10,5,4,10,9,8
  166.                     
  167.  Besonderheiten :
  168.  
  169.   Rekursion
  170.   
  171. }
  172.